﻿using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Web.Mvc;
using ABC.Business.Models;
using ABC.Controllers.ViewModels;
using CaptchaLib;

namespace ABC.Controllers
{
    public class GuestController : BaseController
    {
        private readonly AuthenticationModel AuthenticationModel;

        private readonly SmtpClientModel SmtpClientModel;

        public GuestController(AuthenticationModel dataModel, SmtpClientModel smtpClientModel)
        {
            AuthenticationModel = dataModel;
            SmtpClientModel = smtpClientModel;
        }

        [HttpGet]
        public ActionResult Index()
        {
            if (Request.IsAuthenticated)
            {
                return RedirectToAction("Index", "My", new { area = "My" });
            }
            var model = new LoginViewModel();
            return View(model);
        }

        [HttpPost]
        public ActionResult Index(LoginViewModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                if (AuthenticationModel.StringIsEmail(model.Login))
                {
                    var userId = AuthenticationModel.GetUserIdBy(model.Login);
                    if (!string.IsNullOrEmpty(userId))
                    {
                        if (!AuthenticationModel.IsActive(userId))
                        {
                            TempData["email"] = model.Login;
                            return RedirectToAction("Confirm");
                        }
                        if (AuthenticationModel.Authenticate(model.Login, model.Password, model.Save))
                        {
                            if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/") && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                            {
                                return Redirect(returnUrl);
                            }
                            return RedirectToAction("Index", "My", new { area = "My" });
                        }
                    }
                    else
                    {
                        model.InvalidEmail = true;
                        return View(model);
                    }
                }

                if (AuthenticationModel.StringIsPhone(model.Login))
                {
                    var phone = "+7 (" + model.Login.Substring(0, 3) + ") " + model.Login.Substring(3, 3) + "-" + model.Login.Substring(6, 2) + "-" + model.Login.Substring(8, 2);
                    var userId = AuthenticationModel.GetUserIdBy(phone, "ТелефонныйНомер");
                    if (!string.IsNullOrEmpty(userId))
                    {
                        if (!AuthenticationModel.IsActive(userId))
                        {
                            TempData["email"] = AuthenticationModel.GetUserEmail(userId);
                            return RedirectToAction("Confirm");
                        }
                        if (AuthenticationModel.Authenticate(phone, model.Password, model.Save, "ТелефонныйНомер"))
                        {
                            if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/") && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                            {
                                return Redirect(returnUrl);
                            }
                            return RedirectToAction("Index", "My", new { area = "My" });
                        }
                    }
                    else
                    {
                        model.InvalidPhone = true;
                        return View(model);
                    }
                }
                model.InvalidLogin = true;
            }
            return View("Index", model);
        }

        [HttpGet]
        public ActionResult Register()
        {
            return View(new RegisterViewModel());
        }

        [HttpPost]
        public ActionResult Register(RegisterViewModel model)
        {
            if (ModelState.IsValid)
            {
                model.IsEmail = AuthenticationModel.IsEmail(model.Email);
                if (model.IsEmail)
                {
                    return View(model);

                }
                if (!string.IsNullOrEmpty(model.Phone))
                {
                    model.IsPhoneNumber = AuthenticationModel.IsPhoneNumber(model.Phone);
                    if (model.IsPhoneNumber)
                    {
                        return View(model);
                    }
                }
                var v = new Dictionary<string, object>();
                v.Add("Email", model.Email);
                v.Add("НазваниеОбъекта", model.Email);
                v.Add("Имя", model.Name);
                v.Add("ТелефонныйНомер", model.Phone);
                v.Add("ПарольПользователя", model.Password);
                v.Add("Активен", false);
                var number = RandomModel.GetRandomNumber();
                v.Add("КодАктивации", number.ToString());
                AuthenticationModel.Register(v);
                if (SmtpClientModel.Send(model.Email, "Подтверждение регистрации", string.Format("Код подтверждения: {0}", number)))
                {
                    TempData["email"] = model.Email;
                }
                return RedirectToAction("Confirm");
            }
            return View(model);
        }



        [HttpGet]
        public ActionResult Remind()
        {
            return View(new RemindViewModel());
        }

        [HttpPost]
        public ActionResult Remind(RemindViewModel model)
        {
            var password = string.Empty;
            var validCaptcha = ModelState.IsValidField("CaptchaText");
            ModelState["CaptchaText"].Errors.Clear();
            if (!string.IsNullOrEmpty(model.Email))
            {
                if (!string.IsNullOrEmpty((password = AuthenticationModel.RemindByEmail(model.Email))))
                {
                    if (!string.IsNullOrEmpty(model.CaptchaText))
                    {
                        if (validCaptcha)
                        {
                            SmsModel.SendEmail(model.Email, "Восстановление пароля", string.Format("Пароль: {0}", password));
                            model.SendEmail = true;
                            return View(model);
                        }
                        ModelState.AddModelError("e", "Символы изображённые на картинке, были введены неправильно, попробуйте ещё раз.");
                        return View(model);
                    }
                    ModelState.AddModelError("e", "Введите проверочный код с картинки.");
                    return View(model);
                }
                ModelState.AddModelError("e", "Пользователя с таким адресом электронной почты не существует. Проверьте введенные данные и отправьте запрос повторно.");
                return View(model);
            }
            if (!string.IsNullOrEmpty(model.Phone))
            {
                if (!string.IsNullOrEmpty((password = AuthenticationModel.RemindByPhone(model.Phone))))
                {
                    if (!string.IsNullOrEmpty(model.CaptchaText))
                    {
                        if (validCaptcha)
                        {
                            SmsModel.Send(model.Phone, string.Format("Пароль: {0}", password));
                            model.SendPhone = true;
                            return View(model);
                        }
                        ModelState.AddModelError("e", "Символы изображённые на картинке, были введены неправильно, попробуйте ещё раз.");
                        return View(model);
                    }
                    ModelState.AddModelError("e", "Введите проверочный код с картинки.");
                    return View(model);
                }
                ModelState.AddModelError("e", "Пользователя с таким номером телефона не существует. Проверьте введенные данные и отправьте запрос повторно.");
                return View(model);
            }
            ModelState.AddModelError("e", "Для восстановления доступа, вам необходимо ввести адрес электронной почты или номер телефона. Заполните поля и отправьте запрос повторно.");
            return View(model);
        }

        [HttpGet]
        public ActionResult Logoff()
        {
            AuthenticationModel.SignOut();
            return RedirectToAction("Index", "Guest");
        }
        public ActionResult GetCaptcha()
        {
            return this.Captcha();
        }

        [HttpGet]
        public ActionResult Confirm()
        {
            if (TempData["email"] != null && !string.IsNullOrEmpty(TempData["email"].ToString()))
            {
                var model = new ConfirmRegistrationViewModel();
                model.Email = TempData["email"].ToString();
                return View(model);
            }
            return View();
        }

        [HttpPost]
        public string SendActiovationCode(string email)
        {
            var number = RandomModel.GetRandomNumber();

            if (!string.IsNullOrEmpty(AuthenticationModel.GetUserIdBy(email)))
            {
                if (SmtpClientModel.Send(email, "Подтверждение регистрации", string.Format("Код подтверждения: {0}", number)))
                {
                    AuthenticationModel.UpdateUserActivationCode(email, number.ToString());
                    TempData["email"] = email;
                    return "ok";
                }
            }
            else
            {
                return "usernotfound";
            }
            return "no";
        }

        [HttpPost]
        public ActionResult Confirm(ConfirmRegistrationViewModel model)
        {
            if (AuthenticationModel.ConfirmRegister(model.Email, model.Code))
            {
                return RedirectToAction("Index", "Guest");
            }
            ModelState.AddModelError("e", "Указан не верный код подтверждения. Проверьте введенные данные и отправьте запрос повторно.");
            return View(model);
        }
    }
}